
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"
#include "SkTypeface.h"
#include "SkPath.h"
#include "SkRegion.h"
#include "SkShader.h"
#include "SkUtils.h"
#include "Sk1DPathEffect.h"
#include "SkCornerPathEffect.h"
#include "SkPathMeasure.h"
#include "SkRandom.h"
#include "SkColorPriv.h"
#include "SkColorFilter.h"
#include "SkDither.h"
#include "SkTypefaceCache.h"

static int dither_4444(int x)
    {
    return ((x << 1) - ((x >> 4 << 4) | (x >> 4))) >> 4;
    }

/** Ensure that the max of the original and dithered value (for alpha) is always
    >= any other dithered value. We apply this "max" in colorpriv.h when we
    predither down to 4444, to be sure that we stay in legal premultiplied form
 */
static void test_4444_dither()
    {
    int buckets[16];
    sk_bzero(buckets, sizeof(buckets));

    for (int a = 0; a <= 0xFF; a++)
        {
        int da = dither_4444(a);
        int maxa = SkMax32(a >> 4, da);
        //    SkDebugf("--- %02X %X\n", a, da);
        buckets[da] += 1;
        for (int c = 0; c <= a; c++)
            {
            int dc = dither_4444(c);
            if (maxa < dc)
                {
                SkDebugf("------------ error a=%d da=%d c=%d dc=%d\n", a, da,
                         c, dc);
                }
            }
        }
    for (int i = 0; i < 16; i++)
        {
        //    SkDebugf("[%d] = %d\n", i, buckets[i]);
        }
    }

static const struct
    {
    const char* fName;
    SkTypeface::Style   fStyle;
    } gFaces[] =
    {
        { "sans-serif", SkTypeface::kNormal },
        { "sans-serif", SkTypeface::kBold },
        { "sans-serif", SkTypeface::kItalic },
        { "sans-serif", SkTypeface::kBoldItalic },
        { "serif", SkTypeface::kNormal },
        { "serif", SkTypeface::kBold },
        { "serif", SkTypeface::kItalic },
        { "serif", SkTypeface::kBoldItalic },
        { "monospace", SkTypeface::kNormal },
        { "monospace", SkTypeface::kBold },
        { "monospace", SkTypeface::kItalic },
        { "monospace", SkTypeface::kBoldItalic },
    };

static const int gFaceCount = SK_ARRAY_COUNT(gFaces);

class TypefaceView : public SampleView
    {
        SkTypeface* fFaces[gFaceCount];

    public:
        TypefaceView()
            {
            test_4444_dither();
            for (int i = 0; i < gFaceCount; i++)
                {
                fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
                                                       gFaces[i].fStyle);
                }

            this->setBGColor(0xFFDDDDDD);
            }

        virtual ~TypefaceView()
            {
            for (int i = 0; i < gFaceCount; i++)
                {
                SkSafeUnref(fFaces[i]);
                }

            SkTypefaceCache::Dump();
            }

    protected:
        // overrides from SkEventSink
        virtual bool onQuery(SkEvent* evt)
            {
            if (SampleCode::TitleQ(*evt))
                {
                SampleCode::TitleR(evt, "Typefaces");
                return true;
                }
            return this->INHERITED::onQuery(evt);
            }

        virtual void onDrawContent(SkCanvas* canvas)
            {
            SkPaint paint;
            paint.setAntiAlias(true);
            paint.setTextSize(SkIntToScalar(30));

            const char* text = "Hamburgefons";
            const size_t textLen = strlen(text);

            SkScalar x = SkIntToScalar(10);
            SkScalar dy = paint.getFontMetrics(NULL);
            SkScalar y = dy;

            paint.setLinearText(true);
            for (int i = 0; i < gFaceCount; i++)
                {
                paint.setTypeface(fFaces[i]);
                canvas->drawText(text, textLen, x, y, paint);
                y += dy;
                }
            }

    private:
        typedef SampleView INHERITED;
    };

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory()
    {
    return new TypefaceView;
    }
static SkViewRegister reg(MyFactory);

